package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.DishDto;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/dish")
@Slf4j
public class DishController {
    @Autowired
    private DishService dishService;

    /**
     * 菜品信息分页查询;自己写SQL来完成会简化很多
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page, int pageSize, String name) {
        //构造分页构造器对象
        Page<DishDto> dtoPage = dishService.pages(page, pageSize, name);
        return R.success(dtoPage);
    }

    /**
     * 添加菜品
     * @param dishDto
     * @return
     */
    @PostMapping
    public R<String> add(@RequestBody DishDto dishDto) {
        log.info("dishDto:{}", dishDto.toString());
        dishService.saveWithFlavor(dishDto);
        return R.success("添加成功");
    }

    /**
     * 根据ID获取菜品基本信息和菜品口味信息
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<DishDto> getByIdWithFlavor(@PathVariable Long id) {
        DishDto dishDto = dishService.getByIdWithFlavor(id);
        return R.success(dishDto);
    }

    /**
     * 更新菜品数据
     * @param dishDto
     * @return
     */
    @PutMapping
    public R<String> saveWithFlavor(@RequestBody DishDto dishDto) {
        boolean flag = dishService.updateWithFlavor(dishDto);
        if (flag) {
            return R.success("更新菜品数据成功");
        }
        return R.error("更新菜品数据失败");
    }

    /**
     * 根据条件（type=1）查询菜品分类数据；后端：用于添加套餐时，添加套餐内的菜品；
     * 前端：用于用户登录后选择菜品规格，带有菜品口味，所以用dishDto来传输数据
     */
    @GetMapping("/list")
    public R<List<DishDto>> list(DishDto dishDto) {
        //查询数据库
        List<DishDto> dishDtoList = dishService.listAll(dishDto.getCategoryId(),dishDto.getStatus());
        return R.success(dishDtoList);
    }

    /**
     * 修改菜品状态;支持批量停售和批量启售
     * @param ids 待修改菜品的id集合
     * @param status 各个菜品的状态，0或者1,因为请求路径带有status，故直接启用，停用合为一个方法执行
     * @return
     */
    @PostMapping("/status/{status}")
    public R<String> updateStatus(@RequestParam List<Long> ids,@PathVariable int status) {
        log.info("ids:{},status:{}", ids,status);
        for (Long id : ids) {
            LambdaUpdateWrapper<Dish> updateWrapper = new LambdaUpdateWrapper<>();
            //使用update语句，id作为条件直接改变一条数据，现对于之前的简化了数据库的访问量
            updateWrapper.eq(Dish::getId, id).set(Dish::getStatus, status);
            dishService.update(updateWrapper);//如果没有第一个entity参数,源码中会将entity设为null调用下面的方法
//            dishService.update(null,updateWrapper);
        }
        return R.success("修改菜品状态成功");
    }

    /**
     * 删除菜品信息.
     * @param ids
     * @return
     */
    @DeleteMapping
    public R<String> deleteByIds(@RequestParam List<Long> ids) {
        log.info("ids:{}", ids);
        boolean flag = dishService.deleteByIds(ids);
        if (flag) {
            return R.success("删除菜品成功");
        }
        return R.error("删除失败");
    }
}